package com.woniu.woniu_bx.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.woniu_bx.exception.RoleExistsException;
import com.woniu.woniu_bx.mapper.RoleMapper;
import com.woniu.woniu_bx.mapper.RoleMenuMapper;
import com.woniu.woniu_bx.mapper.RolePermMapper;
import com.woniu.woniu_bx.pojo.Role;
import com.woniu.woniu_bx.service.RoleService;
import com.woniu.woniu_bx.vo.RoleVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @Description 角色
 * @Author zhangjin
 * @Date 2022/8/27 16:23
 */
@Service
@Transactional
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {
    @Resource
    private RoleMapper roleMapper;
    @Resource
    private RoleMenuMapper roleMenuMapper;
    @Resource
    private RolePermMapper rolePermMapper;

    /**
     * 添加角色信息与角色权限、角色菜单关联信息
     *
     * @param roleVo
     */
    @Override
    public void addRole(RoleVo roleVo) {
        if (roleMapper.getRoleNum(roleVo.getRole().getName()) > 0) {
            throw new RoleExistsException("角色已存在");
        } else {
            roleMapper.insert(roleVo.getRole());
            Integer[] menusId = roleVo.getMenusId();
            Integer[] permsId = roleVo.getPermsId();
            if (menusId != null) {
                for (Integer menuId : menusId) {
                    roleMenuMapper.add(roleVo.getRole().getId(), menuId);
                }
            }
            if (permsId != null) {
                for (Integer permId : permsId) {
                    rolePermMapper.add(roleVo.getRole().getId(), permId);
                }
            }
        }
    }

    /**
     * 修改角色信息，同时重置角色权限与菜单
     *
     * @param roleVo
     */
    @Override
    public void updateRole(RoleVo roleVo) {
        Role role = roleVo.getRole();
        roleMapper.updateById(role);
        roleMenuMapper.del(role.getId());
        rolePermMapper.del(role.getId());
        Integer[] menusId = roleVo.getMenusId();
        Integer[] permsId = roleVo.getPermsId();
        if (menusId != null) {
            for (Integer menuId : menusId) {
                roleMenuMapper.add(roleVo.getRole().getId(), menuId);
            }
        }
        if (permsId != null) {
            for (Integer permId : permsId) {
                rolePermMapper.add(roleVo.getRole().getId(), permId);
            }
        }
    }

    @Override
    public void delLogic(int id) {
        roleMapper.logicDel(id);
/*
        逻辑删除的逻辑待定，只设置status为n保留权限和菜单还是设置status为n并删除权限和菜单
        roleMenuMapper.del(id);
        rolePermMapper.del(id);*/
    }

    /**
     * 查询角色并带出拥有的权限以及菜单
     *
     * @param id
     * @return
     */
    @Override
    public Role getRoleByID(int id) {
        return roleMapper.getRoleInfo(id);
    }

    /**
     * 角色分页，每页五条
     *
     * @param current
     * @return
     */
    @Override
    public Page<Role> roleList(int current) {
        Page<Role> page = new Page(current, 5);
        Page<Role> rolePage = roleMapper.findAll(page);
        return rolePage;
    }


    /**
     * 物理删除
     *
     * @param id
     */
    @Override
    public void delRole(int id) {
        roleMapper.delRole(id);
        roleMenuMapper.del(id);
        rolePermMapper.del(id);
    }

}
